# PooledHiLoSequenceOptions.java

    package org.codefilarete.stalactite.mapping.id.sequence.hilo;

    import javax.annotation.Nullable;
    import java.util.Map;

    import org.codefilarete.tool.bean.Objects;
    import org.codefilarete.tool.function.ConverterRegistry;

    /**
     * {@link PooledHiLoSequence} configuration options.
     *
     * @author Guillaume Mary
     */
    public class PooledHiLoSequenceOptions {

    	private static final String POOL_SIZE_PARAM = "poolSize";
    	private static final String SEQUENCE_NAME_PARAM = "sequenceName";
    	private static final String TABLE_PARAM = "table";
    	private static final String SEQUENCE_COLUMN_PARAM = "sequenceNameColumn";
    	private static final String VALUE_COLUMN_PARAM = "valueColumn";

    	private static final ConverterRegistry CONVERTER_REGISTRY = ConverterRegistry.DEFAULT;

    	private final int poolSize;
    	private final String sequenceName;
    	private final PooledHiLoSequenceStorageOptions storageOptions;
    	private final long initialValue;

    	/**
    	 * Simple constructor.
    	 * Pool size will be set to default, and storage options will be those of {@link PooledHiLoSequenceStorageOptions#DEFAULT}
    	 *
    	 * @param sequenceName the name of the sequence, most likely unique for the given {@link PooledHiLoSequenceStorageOptions}
    	 */
    	public PooledHiLoSequenceOptions(String sequenceName) {
    		this(50, sequenceName);
    	}

    	/**
    	 * Simple constructor.
    	 * Storage options will be those of {@link PooledHiLoSequenceStorageOptions#DEFAULT}
    	 *
    	 * @param poolSize the size of the pool
    	 * @param sequenceName the name of the sequence, most likely unique for the given {@link PooledHiLoSequenceStorageOptions}
    	 */
    	public PooledHiLoSequenceOptions(int poolSize, String sequenceName) {
    		this(poolSize, sequenceName, PooledHiLoSequenceStorageOptions.DEFAULT, 1);
    	}

    	/**
    	 * Simple constructor.
    	 *
    	 * @param poolSize the size of the pool
    	 * @param sequenceName the name of the sequence, most likely unique for the given {@link PooledHiLoSequenceStorageOptions}
    	 * @param storageOptions options for storing the sequence in the database
    	 */
    	public PooledHiLoSequenceOptions(int poolSize, String sequenceName, PooledHiLoSequenceStorageOptions storageOptions) {
    		this(poolSize, sequenceName, storageOptions, 1);
    	}

    	/**
    	 * Detailed constructor.
    	 *
    	 * @param poolSize the size of the pool
    	 * @param sequenceName the name of the sequence, most likely unique for the given {@link PooledHiLoSequenceStorageOptions}
    	 * @param storageOptions options for storing the sequence in the database, if null {@link PooledHiLoSequenceStorageOptions#DEFAULT} will be used
    	 * @param initialValue the initial value for the very first insertion, never used again
    	 */
    	public PooledHiLoSequenceOptions(int poolSize, String sequenceName, @Nullable PooledHiLoSequenceStorageOptions storageOptions, long initialValue) {
    		this.poolSize = poolSize;
    		this.sequenceName = sequenceName;
    		this.storageOptions = Objects.preventNull(storageOptions, PooledHiLoSequenceStorageOptions.DEFAULT);
    		this.initialValue = initialValue;
    	}

    	public PooledHiLoSequenceOptions(Map<String, Object> configuration) {
    		this(CONVERTER_REGISTRY.asInteger(configuration.get(POOL_SIZE_PARAM)),
    				CONVERTER_REGISTRY.asString(configuration.get(SEQUENCE_NAME_PARAM)),
    				new PooledHiLoSequenceStorageOptions(CONVERTER_REGISTRY.asString(configuration.get(TABLE_PARAM)),
    						CONVERTER_REGISTRY.asString(configuration.get(SEQUENCE_COLUMN_PARAM)),
    						CONVERTER_REGISTRY.asString(configuration.get(VALUE_COLUMN_PARAM))
    				)
    		);
    	}

    	public int getPoolSize() {
    		return poolSize;
    	}

    	public String getSequenceName() {
    		return sequenceName;
    	}

    	public PooledHiLoSequenceStorageOptions getStorageOptions() {
    		return storageOptions;
    	}

    	/**
    	 * To be used only the very first time of insertion of the sequence in the database
    	 *
    	 * @return the value passed at constructor
    	 */
    	public long getInitialValue() {
    		return initialValue;
    	}
    }